Cloud Functions から Stackdriver に log 書く & ログのグループ化(未完)
console.log はjsonPayload にならない?
GAE では Stdout をがんばれば構造化できたが...
console.log({...}) や console.log(JSON.stringify({...})) は textPayload になる
素直に @google-cloud/logging 使ってみる
普通に使えば構造化ログができる
https://gyazo.com/bbed4bed41cd1bf0e8dc51eb0454523d
resouce や timestamp など埋めてくれている
nodejs10 runtime では環境変数から region 取れない
trace は入ってない
Function execution started と紐付けたい
👉 nodejs8 runtime でやる
起動時のログに httpRequest がないし (httpRequest.requestUrl が親に含まれていないといけない)
Cloud Functions では executionId で紐づく説
なにかのブログで読んだ
Function-Execution-ID はリクエストヘッダに入っている
labels に書き出してもダメ
trace をなんとかしていれる
metadata に入れると起動メッセージと同じ階層に入る
これが分かるまで、labels に入れたり json エントリに入れたり忙しかった
logging.googleapis.com/trace でなく単に trace でないと出ない気がするが...
結局出ない
https://gyazo.com/00295ab34bace2c1469bc7ad9aa11287
ひっつかへんやんけ~~~
まあ stareted ~ finished も紐付いてないしね
⭕同じ GCP プロジェクト
⭕logID (logName) が別々
⭕Monitored Resource が同一 (resource 以下)
⭕trace が同一
(言及されてないけど) labels.execution_id が同一
GAE と違うとこ
start < log < end ではあるけど、start 自体に終了時刻持ってない
parent に httpRequest フィールドがない
まあこれらが必須なんかな...
次やりたい
express でアクセスログ出す & それにアプリケーションログを紐付ける
リンク
"Grouping Logs by Request" のセクション
PubSub トリガなら無理なんかな > Parent entries must have HTTPRequest.Request populated.
CloudFunction も同様
前やったやつ
たんに bunyan するだけでは jsonPayload にならない → これは勘違い
サンプルのやつだと 標準出力と Stackdriver Logging API の 2 箇所に書いて両方拾われる
標準出力のほうは textPayload のまま、API で書かれたほうは jsonPayload になる
winston 版は trace やってくれる節がある?
bunyan もやってくれそうだけど
別に今は @google-cloud/logging を使っていて自前で Metadata 作る必要ない...
これを参考にしたブログ記事がいくつかあって不思議、昔は必要だったんかな